//
//  ControlSequenceViewController.swift
//  Example
//
//  Created by T AO on 2022/2/14.
//

import UIKit

private let screenW = UIScreen.main.bounds.width

class ControlSequenceViewController: BaseViewController {
    
    private let textField: UITextField = UITextField(frame: CGRect(x: 20, y: 100, width: screenW - 40, height: 50))
    
    private let label: UILabel = UILabel(frame: CGRect(x: 20, y: 200, width: screenW - 40, height: 50))
    
    private let button: UIButton = UIButton(frame: CGRect(x: 30, y: 300, width: screenW - 60, height: 50))

    override func viewDidLoad() {
        super.viewDidLoad()

        makeUI()
        
        controlProperty()
        controlEvent()
    }
    
    private func makeUI() {
        textField.backgroundColor = .red
        label.backgroundColor = .orange
        
        button.setTitle("点击", for: .normal)
        button.backgroundColor = .red
        
        view.addSubview(textField)
        view.addSubview(label)
        view.addSubview(button)
    }

}

extension ControlSequenceViewController {
    /// ControlProperty
    /// （1）ControlProperty 是专门用来描述 UI 控件属性，拥有该类型的属性都是被观察者（Observable）
    /// （2）ControlProperty 具有以下特征：
    ///     不会产生 error 事件
    ///     一定在 MainScheduler 订阅（主线程订阅）
    ///     一定在 MainScheduler 监听（主线程监听）
    ///     共享状态变化
    private func controlProperty() {
        // 其实在 RxCocoa 下许多 UI 控件属性都是被观察者（可观察序列）
        // 那么我们如果想让一个 textField 里输入内容实时地显示在另一个 label 上，即前者作为被观察者，后者作为观察者
        textField.rx.text
            .bind(to: label.rx.text)
            .disposed(by: disposeBag)
    }
    
    /// ControlEvent
    /// （1）ControlEvent 是专门用于描述 UI 所产生的事件，拥有该类型的属性都是被观察者（Observable）
    /// （2）ControlEvent 和 ControlProperty 一样，都具有以下特征：
    ///     不会产生 error 事件
    ///     一定在 MainScheduler 订阅（主线程订阅）
    ///     一定在 MainScheduler 监听（主线程监听）
    ///     共享状态变化
    private func controlEvent() {
        // 同样地，在 RxCocoa 下许多 UI 控件的事件方法都是被观察者（可观察序列）
        // 那么我们如果想实现当一个 button 被点击时，在控制台输出一段文字。即前者作为被观察者，后者作为观察者
        button.rx.tap
            .subscribe(onNext: { print("www.baidu.com") })
            .disposed(by: disposeBag)
    }
}
